package com.far.dao;

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;


import org.apache.log4j.Logger;

import oracle.jdbc.OracleTypes;
import utiles.AppProperties;
import utiles.ConexionPool;
import utiles.utilitarios;

import com.far.dto.BoletasPendientesDTO;
import com.far.dto.DocumentoDTO;
import com.far.dto.GuiaDespachoDetalleDTO;


public class FarGuiaDespachoDAO {
	private static Logger log = Logger.getLogger(FarGuiaDespachoDAO.class);
	String pkgVar = (AppProperties.getProperty("aplicacion", "PACKAGE"));
	String horaActual = utilitarios.getFechaHoraActual(); //utilitarios.getHoraActual();


	public  List<BoletasPendientesDTO> getBoletasGroupConvenios(String idSede, String fechaSel) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<BoletasPendientesDTO> listRetorno = new ArrayList<BoletasPendientesDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getBoletasGroupConvenios(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idSede);
			stmt.setString(2, fechaSel);
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				BoletasPendientesDTO boletasPendDTO = new BoletasPendientesDTO();
				boletasPendDTO.setNoCuenta(rs.getString(1));
				boletasPendDTO.setEmpresa(rs.getString(2)); 
				boletasPendDTO.setCantidad(rs.getString(3)); 
				boletasPendDTO.setSubTotal(rs.getString(4));
				boletasPendDTO.setDescuento(rs.getString(5));
				boletasPendDTO.setTotal(rs.getString(6));
				listRetorno.add(boletasPendDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error(horaActual+"Error FarGuiaDespachoDAO.getBoletasGroupConvenios SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}


	public  List<BoletasPendientesDTO> getBoletasGroupPacientes(String idSede, String fechaSel) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<BoletasPendientesDTO> listRetorno = new ArrayList<BoletasPendientesDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getBoletasGroupPacientes(?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idSede);		
			stmt.setString(2, fechaSel);		
			stmt.registerOutParameter(3, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(3);
			while (rs.next()) {
				BoletasPendientesDTO boletasPendPACDTO = new BoletasPendientesDTO();
				boletasPendPACDTO.setNoCuenta(rs.getString(1));
				boletasPendPACDTO.setFolio(rs.getString(2));
				boletasPendPACDTO.setEmpresa(rs.getString(3));
				boletasPendPACDTO.setPaciente(rs.getString(4)); 
				boletasPendPACDTO.setSubTotal(rs.getString(5)); 
				boletasPendPACDTO.setDescuento(rs.getString(6));
				boletasPendPACDTO.setTotal(rs.getString(7));
				listRetorno.add(boletasPendPACDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error(horaActual+"Error FarGuiaDespachoDAO.getBoletasGroupPacientes SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}

	public  List<BoletasPendientesDTO> getBoletasNoConvenios(String idSede, String fechaSel, String filtro, String tipoDoc) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<BoletasPendientesDTO> listRetorno = new ArrayList<BoletasPendientesDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getBoletasNoConvenios(?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idSede);
			stmt.setString(2, fechaSel);
			stmt.setString(3, filtro);
			stmt.setString(4, tipoDoc);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);
			while (rs.next()) {
				BoletasPendientesDTO boletasPendNoConvDTO = new BoletasPendientesDTO();
				boletasPendNoConvDTO.setFolio(rs.getString(1));
				boletasPendNoConvDTO.setPaciente(rs.getString(2)); 
				boletasPendNoConvDTO.setSubTotal(rs.getString(3));
				boletasPendNoConvDTO.setDescuento(rs.getString(4));
				boletasPendNoConvDTO.setTotal(rs.getString(5));
				
				listRetorno.add(boletasPendNoConvDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getBoletasNoConvenios SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	public  List<GuiaDespachoDetalleDTO> getBoletasDetalleNoConvenios(String folios) throws MissingResourceException, IOException, SQLException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<GuiaDespachoDetalleDTO> listRetorno = new ArrayList<GuiaDespachoDetalleDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getBoletasDetalleNoConvenios(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, folios);		
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				GuiaDespachoDetalleDTO guiaDTO = new GuiaDespachoDetalleDTO();
				guiaDTO.setKinf(rs.getString(1));
				guiaDTO.setPresentacion(rs.getString(2));
				guiaDTO.setDescripcion(rs.getString(3)); 
				guiaDTO.setCantidad(rs.getString(4)); 
				guiaDTO.setPreciolista(rs.getString(5));
				guiaDTO.setGratuidad(rs.getString(6));
				guiaDTO.setTotalneto(rs.getString(7));				
				listRetorno.add(guiaDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getBoletasDetalleNoConvenios SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}	
	
	public  List<GuiaDespachoDetalleDTO> getBoletasDetalle(String idContrato, String idFolio, String idSede, String fechaSel) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<GuiaDespachoDetalleDTO> listRetorno = new ArrayList<GuiaDespachoDetalleDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getBoletasDetalle(?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idContrato);		
			stmt.setString(2, idFolio);	
			stmt.setString(3, idSede);
			stmt.setString(4, fechaSel);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);
			while (rs.next()) {
				GuiaDespachoDetalleDTO guiaDTO = new GuiaDespachoDetalleDTO();
				guiaDTO.setKinf(rs.getString(1));
				guiaDTO.setPresentacion(rs.getString(2));
				guiaDTO.setDescripcion(rs.getString(3)); 
				guiaDTO.setCantidad(rs.getString(4)); 
				guiaDTO.setPreciolista(rs.getString(5));
				guiaDTO.setGratuidad(rs.getString(6));
				guiaDTO.setTotalneto(rs.getString(7));				
				listRetorno.add(guiaDTO);				

				//	codigomedicamento|presentacion|descripcion|cantidad|preciolista|gratuidad|totalneto
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getBoletasDetalle SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}

	public  List<DocumentoDTO> getDocumentos(String idDoc, String idSede, String fecha, String fechaFin, String idTipoDoc) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	
        //System.out.println("fecha:"+fecha);
		List<DocumentoDTO> listRetorno = new ArrayList<DocumentoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getDocumentos(?,?,?,?,?, ?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);			
			stmt.setString(1, idDoc);
			stmt.setString(2, idSede);	
			stmt.setString(3, fecha);
			stmt.setString(4, fechaFin);
			stmt.setString(5, idTipoDoc);
			//System.out.println("idDoc:"+idDoc+"; idSede:"+idSede+"; fecha:"+fecha+"; fechaFin:"+fechaFin+"; idTipoDoc:"+idTipoDoc);
			stmt.registerOutParameter(6, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(6);
			while (rs.next()) {
				DocumentoDTO documDTO = new DocumentoDTO();
				documDTO.setRutemp(rs.getString(1));
				documDTO.setEmpresa(rs.getString(2)); 
				documDTO.setIdDocumento(rs.getString(3)); 
				documDTO.setSii(rs.getString(4)); 
				documDTO.setFecEmision(rs.getString(5));
				documDTO.setSubTotal(rs.getString(6));
				documDTO.setDescuento(rs.getString(7));
				documDTO.setNeto(rs.getString(8));
				documDTO.setIvaPct(rs.getString(9));
				documDTO.setIva(rs.getString(10));
				documDTO.setTotal(rs.getString(11));
				documDTO.setIdCliente(rs.getString(12));
				documDTO.setIdEstado(rs.getString(13));
				documDTO.setEstado(rs.getString(14));
				documDTO.setFechaDigit(rs.getString(15));
				documDTO.setIdUser(rs.getString(16));
				documDTO.setUsuario(rs.getString(17));
				documDTO.setIdTipoTrans(rs.getString(18));
				documDTO.setTipoTrans(rs.getString(19));
				documDTO.setCondCompra(rs.getString(20));
				documDTO.setNroOC(rs.getString(21));
				documDTO.setSede(rs.getString(22));
				documDTO.setIdTipoDocumento(rs.getString(23));
				listRetorno.add(documDTO);						
				//rute|str_descripcion|id_documento|num_sii|
				//fec_emision|num_neto_lista|num_percen_gratuidad|num_neto_total				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getDocumentos SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	public  List<GuiaDespachoDetalleDTO> getDocumentoDetalles(String idDocumento) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<GuiaDespachoDetalleDTO> listRetorno = new ArrayList<GuiaDespachoDetalleDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getDocumentoDetalles(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idDocumento);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				GuiaDespachoDetalleDTO guiaDTO = new GuiaDespachoDetalleDTO();
				guiaDTO.setKinf(rs.getString(1));
				guiaDTO.setPresentacion(rs.getString(2));
				guiaDTO.setDescripcion(rs.getString(3)); 
				guiaDTO.setCantidad(rs.getString(4)); 
				guiaDTO.setPreciolista(rs.getString(5));
				guiaDTO.setGratuidad(rs.getString(6));
				guiaDTO.setTotalneto(rs.getString(7));
				guiaDTO.setDescripcionItem(rs.getString(8));
				listRetorno.add(guiaDTO);				

				//	codigomedicamento|presentacion|descripcion|cantidad|preciolista|gratuidad|totalneto
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getBoletasDetalle SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	public  List<DocumentoDTO> getDocumentoReferencia(String idDocumento) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<DocumentoDTO> listRetorno = new ArrayList<DocumentoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_GUIA_DESPACHO_2.getDocumentoReferencia(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idDocumento);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				DocumentoDTO documDTO = new DocumentoDTO();
				documDTO.setIdTipoDocumento(rs.getString(1));
				documDTO.setIdDocumento(rs.getString(2));
				documDTO.setFecEmision(rs.getString(3));
				documDTO.setTotal(rs.getString(4));
				listRetorno.add(documDTO);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error FarGuiaDespachoDAO.getDocumentoReferencia SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}

}
